package br.com.quiz.bean;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.hibernate.HibernateException;

import br.com.quiz.dao.AbstractDAO;
import br.com.quiz.dao.AlunoDAO;
import br.com.quiz.dao.DisciplinaDAO;
import br.com.quiz.dao.UnidadedeEnsinoDAO;
import br.com.quiz.domain.Aluno;
import br.com.quiz.domain.UnidadedeEnsino;
import br.com.quiz.util.JSFUtil;

@ManagedBean( name = "AlunoMB" )
@ViewScoped
public class AlunoMB{
	private Aluno aluno;
	private ArrayList< Aluno > alunos;
	private ArrayList< UnidadedeEnsino > unidadesEnsino;
	private ArrayList< Aluno > alunosFiltrados;
	private Integer uEnsinoID;

	public Integer getuEnsinoID() {
		return uEnsinoID;
	}

	public void setuEnsinoID( Integer uEnsinoID ) {
		this.uEnsinoID = uEnsinoID;
	}

	public ArrayList< UnidadedeEnsino > getUnidadesEnsino() {
		if ( unidadesEnsino == null ) {
			listarUnidadesEnsino();
		}
		return unidadesEnsino;
	}

	public void setUnidadesEnsino( ArrayList< UnidadedeEnsino > unidadesEnsino ) {
		this.unidadesEnsino = unidadesEnsino;
	}

	public Aluno getAluno() {
		return aluno;
	}

	public void setAluno( Aluno aluno ) {
		this.aluno = aluno;
	}

	public ArrayList< Aluno > getAlunos() {
		return alunos;
	}

	public void setAlunos( ArrayList< Aluno > alunos ) {
		this.alunos = alunos;
	}

	public ArrayList< Aluno > getAlunosFiltrados() {
		return alunosFiltrados;
	}

	public void setAlunosFiltrados( ArrayList< Aluno > alunosFiltrados ) {
		this.alunosFiltrados = alunosFiltrados;
	}

	@PostConstruct
	public void prepararPesquisa() {

		try {
			alunos = (ArrayList< Aluno >) AlunoDAO.listar();
		} catch ( Exception e ) {
			e.printStackTrace();
			JSFUtil.adicionarMensagemErro( e.getMessage() );
		}

	}

	public void prepararNovo() {
		aluno = new Aluno();
		unidadesEnsino = (ArrayList< UnidadedeEnsino >) UnidadedeEnsinoDAO.listar();

	}

	public void novo() {

		try {

			AlunoDAO.salvarOuEditarCriptografado( aluno );
			alunos = (ArrayList< Aluno >) AlunoDAO.listar();
			JSFUtil.adicionarMensagemSucesso( "Aluno salvo com Sucesso" );
		} catch ( HibernateException e ) {
			JSFUtil.adicionarMensagemErro( e.getMessage() );
		}
	}

	public void excluir() {
		try {

			AbstractDAO.apagar( aluno );

			alunos = (ArrayList< Aluno >) AlunoDAO.listar();
			JSFUtil.adicionarMensagemSucesso( "Fabricante excluido com sucesso!" );
		} catch ( HibernateException e ) {
			JSFUtil.adicionarMensagemErro( e.getMessage() );
		}
	}

	public void editar() {

		try {

			AlunoDAO.salvarOuEditarCriptografado( aluno );
			alunos = (ArrayList< Aluno >) AlunoDAO.listar();

			JSFUtil.adicionarMensagemSucesso( "Aluno editado com Sucesso" );
		} catch ( HibernateException e ) {
			JSFUtil.adicionarMensagemErro( e.getMessage() );
		}

	}

	JasperPrint jasperPrint;

	public void init() throws JRException {
		JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource( alunos );
		jasperPrint = JasperFillManager.fillReport( "/reports/relatorioAluno.jasper", new HashMap(), beanCollectionDataSource );
	}

	public void PDF() throws JRException, IOException {
		init();
		HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
		ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
		JasperExportManager.exportReportToPdfStream( jasperPrint, servletOutputStream );
	}

	public void listarUnidadesEnsino() {

		try {
			unidadesEnsino = (ArrayList< UnidadedeEnsino >) UnidadedeEnsinoDAO.listar();
		} catch ( Exception e ) {
			e.printStackTrace();
			JSFUtil.adicionarMensagemErro( e.getMessage() );
		}

	}
}
